home *** CD-ROM | disk | FTP | other *** search
/ Software USA 3 #11 / Software USA Volume 3.11.iso / mac / Games / World Builder / Documentation / Advanced Code / AMOT "Secretary" Code < prev    next >
Text File  |  1995-11-28  |  19KB  |  367 lines

  1.  
  2. Advanced World Builder Programming, Part Three
  3.                        by Ray Dunakin 
  4.  
  5.  
  6. This code comes from the scene titled "Secretary", from my game "A Mess O'Trouble".  This is a very complex scene that demonstrates the advanced use of variables.
  7.  
  8. In this scenario, the player has entered the Department of Security and is met by a secretary at his desk. The player needs two things here: The secret password to enter the President's headquarters; and a special admittance form to enter the Utilities Department. The form must be filled out, and signed by the chief of security. When the player asks for either of these things, the secretary says he must cleared it with the chief, and leaves the room. When he returns, he tells the player that his request has been denied. 
  9.  
  10. In order to get the form and secret password, the player must ask again for these things, then explore the secretary's desk while the secretary is out of the room. He can also use the typewriter during this time. If he takes too long, the secretary returns and stops him.
  11.  
  12.  
  13.  
  14.  
  15. IF{LOOP#=0}THEN
  16.     IF{T8#<2}THEN
  17.         MOVE{DARK}TO{SCENE@}
  18.         MOVE{PLAYER@}TO{RANDOMSCN@}
  19.     EXIT
  20.     MOVE{DARK}TO{STORAGE@}
  21.     IF{D1#=0}THEN
  22.         MOVE{SECRETARY.1}TO{SCENE@}
  23.     END
  24. END
  25.  
  26. This section of code handles the player's premature appearance in the scene. This game has Jump Doors that can move a player to a randomly chosen scene. However, some scenes are supposed to be closed to the player until he has completed some puzzle. In this case, this part of the city can only be accessed after the player has obtained a validated tram pass. So this section of code first checks to see if the player has obtained a tram pass and had it validated. It does this by checking variable T8, which is the tram pass variable. 
  27.  
  28. If T8 is less than 2, meaning the player has no validated tram pass, then the scene is blacked out by moving the DARK object to the scene, and the player is moved to another random scene. The program then EXITs. If T8 equals 2 or more, than the DARK is returned to storage and the program continues.
  29.  
  30. The program then checks the status of variable D1. This variable determines whether or not the secretary object is supposed to be in the scene. (The secretary is an Object, NOT a Character! This gives the player complete control over the secretary's actions.)  If D1 is zero, if means the secretary is supposed to be in the scene, and the program is instructed to move that object to the scene.
  31.  
  32.  
  33.  
  34. IF{D1#=1}THEN
  35.     LET{D2#=D2#+1}
  36. END
  37.  
  38. When the secretary leaves the room, D1 is set to 1. Variable D2 is a counter that counts the number of actions the player takes in the scene. This brief conditional statement checks to see if the secretary is out of the room (D1=1), and if so, adds one point to the D2 counter. In this way, I can simulate the passage of time. The player only has a limited number of moves between the time the secretary leaves, and when the secretary returns. D2 is only updated when D1#=1.
  39.  
  40.  
  41.  
  42.  
  43. IF{LOOP#=0}OR{TEXT$=LOOK}THEN
  44.     IF{TEXT$=DESK}OR{TEXT$=DRAWER}THEN
  45.         PRINT{........................................}
  46.         IF{SECRETARY.1=SCENE@}THEN
  47.             PRINT{SECRETARY: "Get away from there or I'll call the guards!"}
  48.         EXIT
  49.         IF{FORM=STORAGE@}AND{F9#<1}THEN
  50.             MOVE{FORM}TO{SCENE@}
  51.             PRINT{There is a Utility Area Admittance form in the desk.}
  52.         EXIT
  53.         PRINT{There is nothing of interest in the desk.}
  54.     EXIT     
  55.     IF{TEXT$=WASTE}OR{TEXT$=BASKET}OR{TEXT$=TRASH}OR{TEXT$=GARBAGE}OR{TEXT$=RUBBISH}
  56. THEN
  57.         PRINT{........................................}
  58.         IF{SECRETARY.1=SCENE@}THEN
  59.             PRINT{SECRETARY: "Get away from there or I'll call the guards!"}
  60.         EXIT
  61.         IF{FORM=STORAGE@}AND{F9#<1}THEN
  62.             MOVE{FORM}TO{SCENE@}
  63.             PRINT{There is a Utility Area Admittance form in the trash.}
  64.         EXIT
  65.         PRINT{There is nothing of interest in the wastebasket.}
  66.     EXIT
  67.     PRINT{You are in the offices of the Department of  Security. There is a closed door to the SOUTH, and the exit is NORTH.}
  68.     IF{D3#=1}THEN
  69.         PRINT{........................................}
  70.         PRINT{SECRETARY: "Oh there you are! The boss turned down your request. She says you're not a good security risk."}
  71.         PRINT{"Do you want to try again?"}
  72.         LET{D3#=0}
  73.     EXIT
  74.     IF{SECRETARY.1=SCENE@}THEN
  75.         PRINT{........................................}
  76.         PRINT{SECRETARY: "What can I do for you?"}
  77.     END
  78. END
  79.  
  80. The LOOK code here is fairly complex. It must print a scene description when the player enters the scene, or when the player uses the LOOK command. The secretary's greeting to the player varies, and is a part of the scene description, so the scene description also varies. In addition, this section of code handles the player's request to look in the desk, look in the trash, etc.
  81.  
  82. The first nested statement checks to see if the player used the words DESK or DRAWER. The next statement checks to see if the secretary is in the scene, and if so, stops the player from taking that action.
  83.  
  84. The next condition checked is the status of the form. Variable F9 tracks whether the form has been used already. If the form is in storage, AND has not already been used (F9#<1), then form is moved to the scene, and the player is told that he has found a Utility Area Admittance form in the desk. If either of those conditions is not true, then the player is told that the desk is empty. The program then EXITs. 
  85.  
  86. If LOOK is not followed by DESK or DRAWER, then the next thing the program checks is whether any words have been used that indicate the player wants to look in the TRASH. The form can be found in either the desk or the trash, whichever the player looks into first. So this section of the code repeats the steps used for looking in the desk. 
  87.  
  88. Finally, if there are no modifiers used with LOOK, then the scene description is printed. The secretary's greeting is included in the scene description. Since it is possible for the player to leave the scene while the secretary is out of the room, and return later, the greeting must reflect this. So variable D3 tracks that condition, and is checked here. If D3#=1, meaning that the player did indeed leave while the secretary was gone, and is now returning, a special greeting is printed which refers to the fact the player left prematurely, tells him that he request has been denied. The variable is then reset to zero. If D3 does not equal one, then the standard greeting is printed: "What can I do for you?"
  89.  
  90. The entire loop-zero/look code closes with END. In this way, if the player has dropped something in the scene earlier, the object will automatically be mentioned in the scene text.
  91.  
  92.  
  93.  
  94. IF{D2#=5}THEN
  95.     PRINT{..........................................}
  96.     SOUND{DOOR OPENING}
  97.     MOVE{SEC.DOOR}TO{STORAGE@}
  98.     MOVE{SECRETARY.2}TO{SCENE@}
  99.     MOVE{SEC.DOOR}TO{SCENE@}
  100.     SOUND{DOOR CLOSING}
  101.     MOVE{SECRETARY.2}TO{STORAGE@}
  102.     PRINT{The door opens and the secretary enters the room.}
  103.     MOVE{SECRETARY.1}TO{SCENE@}
  104.     LET{D1#=0}
  105.     LET{D2#=0}
  106.     LET{A1#=RANDOM#}
  107.     IF{A1#>80}THEN
  108.         PRINT{SECRETARY: "I'm sorry, the boss says No. She doesn't think you're a good security risk."}
  109.         PRINT{"Perhaps you could try again later."}
  110.     EXIT
  111.     IF{A1#>50}AND{A1#<81}THEN
  112.         PRINT{SECRETARY: "I'm sorry, the boss says you aren't cleared for that. Request denied."}
  113.         PRINT{"Perhaps you could try again later."}
  114.     EXIT
  115.     IF{A1#>20}AND{A1#<51}THEN
  116.         PRINT{SECRETARY: "I'm sorry, the boss refuses to clear you on that. Request denied."}
  117.         PRINT{"Perhaps you could try again later."}
  118.     EXIT
  119.     IF{A1#<21}THEN
  120.         PRINT{SECRETARY: "I'm sorry, the boss is too busy to issue the necessary clearance right now. Request denied."}
  121.         PRINT{"Perhaps you could try again later."}
  122.     EXIT
  123. END
  124.  
  125. When variable D2 reaches five, it triggers this section of code. The secretary is returned to the scene, D1 and D2 are reset to zero, and one of four randomly chosen replies is printed. Resetting D1 allows the player to repeat the steps needed to convince the secretary to leave the room. Since variable D2 is a counter that controls the reappearance of the secretary, it too must be reset now that the secretary is back. 
  126.  
  127. World Builder generates a random number between 1 and 100 each time you use RANDOM#. 
  128.  
  129. When you want to have several response randomly selected, assign a variable to contain the random number. If you merely use RANDOM#, then a different number would be chosen each time, giving unsatisfactory results. But when you assign a random number to a variable, that variable holds whatever random number is chosen, until such time as you reassign it. The same variable can usually be used to hold random numbers throughout the game.
  130.  
  131. After a random number has been assigned to variable A1, there are four conditional statements that determine which response to print. If A1 is more than 81, the first response is printed. If A1 is less than 80, AND more than 50, the second response is printed. If it is less than 51, AND more than 20, the third response is printed. Finally, if A1 is less than 21 the fourth response will be printed. 
  132.  
  133. Of course, you can write code that will offer as many possible response as you like. You can also set the percentages to favor one or more responses over others. The only limit is your imagination, and the amount of available code space in the scene. 
  134.  
  135. I could have used only one standard response in this setting. But using several randomly picked responses made the secretary seem more life-like, and less boring.
  136.  
  137. This entire section of code must come before any codes that handle the player's actions or conversation. In fact, I see now that it should have been placed BEFORE the LOOK code! This is another example of how you can be tripped up by complex code. As it is now, if the player tries to look in the desk or in the trash, that action will intercept the program before it reaches this section of code. If variable D2 is at five when the player does that, the variable will reach five or more before this code is reached. Since this code only returns the secretary to the scene when D2 is EXACTLY five, if it goes above that then the secretary will never return! The chances of this happening in precisely this way are small, and it wouldn't cause serious problems if it did. But it should still be corrected. (This has been corrected in later versions of the game.) 
  138.  
  139. I corrected it by simply changing it to D2#>4. If I do this, looking in the desk or trash might still allow D2 to go higher than 5, but it wouldn't matter since the code would kick in any time D2 is higher than 4.
  140.  
  141.  
  142.  
  143. IF{TEXT$=SEARCH}THEN
  144.     PRINT{.........................................}
  145.     IF{SECRETARY.1=SCENE@}THEN
  146.         PRINT{SECRETARY: "Stop snooping around!"}
  147.     EXIT
  148.     PRINT{There is a typewriter on the desk, to the EAST.}
  149.     PRINT{And there is a wastebasket in the corner.}
  150. EXIT
  151.  
  152. The search code checks to see if the secretary is in the scene, and if so, stops the player from searching. 
  153.  
  154.  
  155.  
  156. IF{TEXT$=SIT}OR{TEXT$=EAST}OR{TEXT$=USE TYPEWRITER}OR{TEXT$=USE CHAIR}THEN
  157.     PRINT{..........................................}
  158.     IF{SECRETARY.1=SCENE@}THEN
  159.         PRINT{SECRETARY: "Stop that! I can't let you use my typewriter."}
  160.     EXIT
  161.     MOVE{PLAYER@}TO{TYPEWRITER}
  162. EXIT
  163.  
  164. The player can use any of these command words, and if the secretary is not in the scene, the player will be moved to a scene where he is sitting at the typewriter. In that scene the player can then use the typewriter to fill out the form, and discover the secret password.
  165.  
  166.  
  167.  
  168. IF{TEXT$=SOUTH}THEN
  169.     PRINT{..........................................}
  170.     IF{SECRETARY.1=SCENE@}THEN
  171.         PRINT{SECRETARY: "You can't go in there! It's not permitted!"}
  172.     EXIT
  173.     PRINT{The secretary and his boss are in there. If you go in they'll have you thrown out, or arrested!}
  174. EXIT
  175.  
  176. This code gives appropriate responses when the player tries to go south through the door to the chief's office.
  177.  
  178.  
  179.  
  180. IF{CLICK$=SEC.DOOR}THEN
  181.     PRINT{..........................................}
  182.     IF{SECRETARY.1=SCENE@}THEN
  183.         PRINT{SECRETARY: "Stay out of there! That's a private office, you're not permitted to enter!"}
  184.     EXIT
  185.     PRINT{The secretary and his boss are in there, so you'd better not open the door.}
  186. EXIT
  187. IF{CLICK$=SEC.TYPEWRITER}THEN
  188.     PRINT{..........................................}
  189.     IF{SECRETARY.1=SCENE@}THEN
  190.         PRINT{SECRETARY: "Leave my typewriter alone!"}
  191.     EXIT
  192.     PRINT{The typewriter is unattended.}
  193. EXIT
  194. IF{CLICK$=SEC.TRASH}THEN
  195.     PRINT{..........................................}
  196.     IF{SECRETARY.1=SCENE@}THEN
  197.         PRINT{SECRETARY: "Get away from there or I'll call the guards!"}
  198.     EXIT
  199.     PRINT{There is a wastebasket here.}
  200. EXIT
  201. IF{CLICK$=SEC.CHAIR}THEN
  202.     PRINT{..........................................}
  203.     IF{SECRETARY.1=SCENE@}THEN
  204.         PRINT{SECRETARY: "Stop that! Leave my chair alone!"}
  205.     EXIT
  206.     PRINT{The secretary's chair is empty.}
  207. EXIT
  208.  
  209. These sections of code handle the object descriptions when the player clicks on them. If the secretary is in the scene, the player is prevented from getting a description of the object.
  210.  
  211.  
  212. IF{TEXT$=GET}OR{TEXT$=TAKE}OR{TEXT$=MOVE}THEN
  213.     PRINT{..........................................}
  214.     IF{SECRETARY.1=SCENE@}THEN
  215.         PRINT{SECRETARY: "Leave that alone!"}
  216.     EXIT
  217.     IF{TEXT$=TYPEWRITER}THEN
  218.         PRINT{The typewriter is bolted to the desk, you can't move it.}
  219.     EXIT
  220.     IF{TEXT$=CHAIR}THEN
  221.         PRINT{You can't move the chair.}
  222.     EXIT
  223.     IF{TEXT$=WASTE}OR{TEXT$=BASKET}THEN
  224.         PRINT{You can't take the wastebasket.}
  225.     EXIT
  226. END
  227.  
  228. This code handles any attempt to move the equipment in the office. Again, if the secretary is in the scene, the action is blocked.
  229.  
  230.  
  231.  
  232. IF{TEXT$=SHOOT}OR{TEXT$=FIRE}OR{TEXT$=SWING}OR{TEXT$=THROW}OR{TEXT$=HIT}OR{TEXT$=KICK}OR{TEXT$=CAST}THEN
  233.     PRINT{..........................................}
  234.     IF{SECRETARY.1=SCENE@}THEN
  235.         SOUND{BUZZER.1}
  236.         SOUND{OUCH}
  237.         PRINT{The secretary pushes a hidden button, and an electrode in the ceiling zaps you silly!}
  238.         PRINT{SECRETARY: "We don't tolerate that kind of behavior around here!"}
  239.     EXIT
  240.     PRINT{Doing that might draw unwanted attention to your activity.}
  241. EXIT
  242.  
  243. This code handles any use of weapons, whether the player is attacking the secretary or merely trying to shoot or break an object. 
  244.  
  245.  
  246.  
  247. IF{TEXT$=READ}THEN
  248.     IF{TEXT$=FORM}THEN
  249.         PRINT{.......................................}
  250.         PRINT{The form is just a typical government form, that allows the bearer to enter the Utility Area.}
  251.         IF{F8#<1}THEN
  252.             PRINT{All the necessary spaces are blank.}
  253.         EXIT
  254.     EXIT
  255. END
  256.  
  257. In some cases the player may try to read the form. This code handles that, and tells him if the form has been filled out or not.
  258.  
  259.  
  260.  
  261. IF{TEXT$=GIVE}OR{TEXT$=OFFER}THEN
  262.     PRINT{..........................................}
  263.     IF{SECRETARY.1=SCENE@}THEN
  264.         IF{TEXT$=FORM}AND{FORM=PLAYER@}THEN
  265.             PRINT{SECRETARY: "You're not supposed to have that!"}
  266.             MOVE{FORM}TO{STORAGE@}
  267.             LET{F9#=0}
  268.             PRINT{The secretary takes the form and throws it away.}
  269.         EXIT
  270.         IF{TEXT$=CARD}AND{SHEKCARD=PLAYER@}THEN
  271.             PRINT{SECRETARY: "You're a friend of Shek Varta? I'm impressed! But even she can't get you a security clearance."}
  272.         EXIT
  273.         PRINT{SECRETARY: "Don't bother trying to bribe me, it won't work!"}
  274.     EXIT
  275. END
  276. This section handles any attempt to give something to the secretary. If it is the form, the player takes the form away and F9 is reset to zero. The player must then repeat the steps needed to get another form. If the player tries to give Shek's card to the secretary, the secretary responds accordingly. Anything else that is offered to the secretary is treated as a bribe attempt.
  277.  
  278.  
  279.  
  280.  
  281. IF{TEXT$=FORM}OR{TEXT$=PASSWORD}OR{TEXT$=ADMITTANCE}OR{TEXT$=YES}OR{TEXT$=SIGNATURE}THEN
  282.     PRINT{..........................................}
  283.     IF{D1#<1}AND{SECRETARY.1=SCENE@}THEN
  284.         IF{A1#>60}THEN
  285.             PRINT{SECRETARY: "I'll have to clear that with the boss. It could take a few minutes. Wait here."}
  286.         END
  287.         IF{A1#>40}AND{A1#<61}THEN
  288.             PRINT{SECRETARY: "That has to be approved by the chief of Security. Wait here."}
  289.         END
  290.         IF{A1#<41}THEN
  291.             PRINT{SECRETARY: "Wait here and I'll see if the boss will approve that."}
  292.         END
  293.         MOVE{SECRETARY.1}TO{STORAGE@}
  294.         MOVE{SECRETARY.2}TO{SCENE@}
  295.         SOUND{WAIT HERE.1}
  296.         SOUND{DOOR OPENING}
  297.         MOVE{SEC.DOOR}TO{STORAGE@}
  298.         MOVE{SECRETARY.2}TO{STORAGE@}
  299.         MOVE{SEC.DOOR}TO{SCENE@}
  300.         SOUND{DOOR CLOSING}
  301.         LET{D1#=1}
  302.     EXIT
  303. END
  304.  
  305. This section handles any other uses of the words FORM, PASSWORD, ADMITTANCE, YES and SIGNATURE. The secretary responds from one of three randomly chosen sentences, and leaves the room. Variable D1 is set to one, indicating that the secretary has left. Any further actions will start up the counter, D2.
  306.  
  307.  
  308. IF{TEXT$=NORTH}THEN
  309.     LET{D1#=0}
  310.     LET{D2#=0}
  311.     IF{SECRETARY.1>SCENE@}THEN
  312.         LET{D3#=1}
  313.     END
  314. END
  315.  
  316. If the player exits the scene at any time, variables D1 and D2 are reset to zero. If the secretary is out of the scene at the time, D3 is set to one.
  317.  
  318.  
  319.  
  320.  
  321. IF{TEXT$==NO}THEN
  322.     PRINT{..........................................}
  323.     IF{SECRETARY.1=SCENE@}THEN
  324.         PRINT{SECRETARY: "Well, if you change your mind, just let me know."}
  325.         PRINT{The secretary continues working.}
  326.     EXIT
  327. END
  328.  
  329. If the player says "No" to any question or statement by the secretary, this standard reply is printed.
  330.  
  331.  
  332. IF{TEXT$=INFO}OR{TEXT$=ASK}OR{TEXT$=TALK}THEN
  333.     PRINT{..........................................}
  334.     IF{SECRETARY.1=SCENE@}THEN
  335.         PRINT{SECRETARY: "Anyone wishing to enter restricted areas of the city must be cleared by Security."}
  336.     EXIT
  337. END
  338.  
  339. This handles the player's attempt to talk to the secretary.
  340.  
  341.  
  342.  
  343. IF{TEXT$=OPEN}THEN
  344.     PRINT{........................................}
  345.     IF{TEXT$=DESK}OR{TEXT$=DRAWER}THEN
  346.         IF{SECRETARY.1=SCENE@}THEN
  347.             PRINT{SECRETARY: "Get away from there or I'll call the guards!"}
  348.         EXIT
  349.         IF{FORM=STORAGE@}AND{F9#<1}THEN
  350.             MOVE{FORM}TO{SCENE@}
  351.             PRINT{There is a Utility Area Admittance form in the desk.}
  352.         EXIT
  353.         PRINT{There is nothing of interest in the desk.}
  354.     EXIT
  355.     IF{TEXT$=DOOR}THEN
  356.         PRINT{..........................................}
  357.         IF{SECRETARY.1=SCENE@}THEN
  358.             PRINT{SECRETARY: "Stay out of there! That's a private office, you're not permitted to enter!"}
  359.         EXIT
  360.         PRINT{The secretary and his boss are in there, so you'd better not open the door.}
  361.     EXIT
  362.     PRINT{What do you want to open?}
  363. EXIT
  364.  
  365.  
  366. This code handles any attempt to open things. The only things that can be opened in this scene are the desk and the door to the chief's office. Opening the desk reveals the form, if the player hasn't already found it.
  367.